package br.estacio.contatos.client.activity;

import br.estacio.contatos.client.event.SalvarContatoHandler;
import br.estacio.contatos.client.place.EditarContatoPlace;
import br.estacio.contatos.client.service.ContatoRemoteServiceAsync;
import br.estacio.contatos.client.ui.ContatoView;
import br.estacio.contatos.shared.Contato;

import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AcceptsOneWidget;

public class EditarContatoActivity extends AbstractActivity implements SalvarContatoHandler {
	
	private Contato contato;
	private ContatoView contatoView;
	private ContatoRemoteServiceAsync contatoRemoteServiceAsync;
	
	public EditarContatoActivity(EditarContatoPlace place, ContatoView contatoView, ContatoRemoteServiceAsync contatoRemoteServiceAsync) {
		this.contatoView = contatoView;
		this.contatoRemoteServiceAsync = contatoRemoteServiceAsync;
		carregarContatoPorIdOuCriarNovo(obterId(place.getContatoId()));
		this.contatoView.setSalvarHandler(this);
	}
	
	@Override
	public void salvarContato() {
		
		atualizarContatoComEstadoDaView();
		
		contatoRemoteServiceAsync.salvar(contato, new AsyncCallback<Contato>() {
			@Override
			public void onSuccess(Contato result) {
				// TODO notificar sucesso
				contato = result;
				atualizarViewComEstadoDoContato();
			}
			
			@Override
			public void onFailure(Throwable caught) {
				// TODO notificar sucesso
				Window.alert("Erro\n"+caught.getMessage());
			}
		});
		
	}

	private void atualizarViewComEstadoDoContato() {
		contatoView.setNome(contato.getNome());
		contatoView.setEmail(contato.getEmail());
		contatoView.setTelefone(contato.getTelefone());
	}

	private void atualizarContatoComEstadoDaView() {
		contato.setNome(contatoView.getNome());
		contato.setEmail(contatoView.getEmail());
		contato.setTelefone(contatoView.getTelefone());
	}

	private void carregarContatoPorIdOuCriarNovo(Integer id) {
		if(id == null) {
			contato = new Contato();
		} else {
			throw new RuntimeException("Carregamento de contato exeistente não implementado");
		}
	}

	private Integer obterId(String contatoId) {
		try {
			return Integer.parseInt(contatoId);
		} catch (NumberFormatException e) {
			return null;
		}
	}

	@Override
	public void start(AcceptsOneWidget panel, EventBus eventBus) {
		contatoView.setNome(contato.getNome());
		contatoView.setEmail(contato.getEmail());
		contatoView.setTelefone(contato.getTelefone());
		panel.setWidget(contatoView);
	}

}
